/*******************************************************
> Copyright (C) 2024 ==IOT== All rights reserved.
> File Name: inherit5.cpp
> Author: IOT
> Website:www.slq.org
> Created Time: 2024年10月25日 星期五 11时10分27秒
***************************************************/

// ---------------------------------------------------------2024年10月25日 14点52分-----------------------------------------------------------------------------
// -----------------------------------------------------------虚函数指针的使用-----------------------------------------------------------------------------------
#include <iostream>
using namespace std;

class Base {
    int m = 13;
public:
    virtual void show()
    {
        cout << "this is base show" << endl;
    }
};

class Derived : public Base {

public:
    virtual void show()
    {
        cout << "this is derived show" << endl;
    }
    void wps() {
        cout << "this is derived wps" << endl;
    }
    virtual void pas() {
        cout << "this is derived pas" << endl;
    }
};

struct ObjMem {
    // 代替虚表指针 （指向函数头地址的指针）
    void **vptr;
    int data;
};

int cnt;

void print()
{}

typedef void (*fun_t)();

int main(int argc,const char* argv[])
{
    Base base;

    cout << "size of base:" << sizeof(base) << endl;
    // 将base强转成结构体指针来
    ObjMem *pobj = (ObjMem *)&base;
    // 运行父类虚函数
    cout << pobj->vptr << endl;
    // 获取父类中的m
    cout << pobj->data << endl;


    int *pi = new int;
    // 堆空间的地址
    cout << "addr of cnt:" << &cnt << endl;
    cout << "malloc:" << pi << endl;
    // 全局函数（数据区）的地址
    cout << "fun addr:" << (void *)&print << endl;
    delete pi;
    // (pobj->vptr[0])  是父类的第一个虚函数  是一个地址  强转为void  来调用
    ((fun_t)(pobj->vptr[0]))();

    base.show();

    Base *po = &base;
    po->show();

    Derived der;
    po = &der;
    po->show();

    // 子类的虚函数 头地址  赋值到  结构体指针中
    pobj = (ObjMem *)&der;
    // (pobj->vptr[0])  是子类的第一个虚函数  是一个地址  强转为void  来调用
    ((fun_t)(pobj->vptr[0]))();
    ((fun_t)(pobj->vptr[1]))();
    return 0;
}
// ====================================================================================================================================================